// Fill out your copyright notice in the Description page of Project Settings.

#pragma once

#include "GameplayTagContainer.h"
#include "Engine/DataAsset.h"
#include "AttributeInfo.generated.h"

/*
 * 属性信息封装
 */
USTRUCT(BlueprintType)
struct FAttributeInformation
{
	GENERATED_BODY()
	/** 在结构体中增加三项不会在项目运行中修改的内容，实际的属性数值，我们则需要实时修改，所以，不需要通过蓝图面板设置。 */

	/** 属性标签 */
	UPROPERTY(EditDefaultsOnly, BlueprintReadOnly)
	FGameplayTag AttributeTag = FGameplayTag();

	/** 属性名 */
	UPROPERTY(EditDefaultsOnly, BlueprintReadOnly)
	FText AttributeName = FText();

	/** 属性描述 */
	UPROPERTY(EditDefaultsOnly, BlueprintReadOnly)
	FText AttributeDescription = FText();

	/** 属性数值 */
	UPROPERTY(BlueprintReadOnly)
	float AttributeValue = 0.f;
};

/**
 * DataAsset则是一种将资源集合在一起的方式，用于实现资源管理。
 * 通过DataAsset，可以将某个对象（如英雄）所使用的所有资源集合在一起，当需要加载该对象时，只需加载对应的DataAsset，
 * 从而避免了加载不必要的资源。DataAsset需要手动定义数据结构并添加引用的数据，它只存储引用，并不同步加载所有数据，
 * 这使得DataAsset在资源管理方面具有较高的灵活性。
 * 我们需要通过代码去 修改 DataAsset内的属性显示的实际的值,使用DataAsset更合理
 *
 * DataTable主要用于存储和读取数据，是一种灵活的数据结构，可以用于存储和维护大量的静态数据。
 */

/*
 * 属性信息数据类
 */
UCLASS()
class AURA_API UAttributeInfo : public UDataAsset
{
	GENERATED_BODY()

public:

	/** 封装的属性信息*/
	UPROPERTY(EditDefaultsOnly, BlueprintReadOnly)
	TArray<FAttributeInformation> AttributeInformationArray;

	/** 根据标签查找属性信息 */
	FAttributeInformation FindAttributeInformationByTag(const FGameplayTag& AttributeTag, bool bLogIfNotFound = false);
};
